﻿/***************************************************************************
 * 文件名：Project
 * 功能：
 * 说明：
 * -------------------------------------------------------------------------
 * 创建时间：2023/9/12 19:27:55
 * 创建人：鲍文轩
 * 邮箱： missingbwx@outlook.com
 * =========================================================================
 *
 * 修改人：   
 * 修改时间：   
 * 修改说明：   
 ***************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Configuration;
namespace test
{
    public class Project
    {
        public string ProjName { get; set; }

        public string ProjCode { get; set; }

        public Project(string projCode,string projName)
        {
            this.ProjCode = projCode;
            this.ProjName = projName;
            this.NotifyDepartments();
        }

        public void NotifyDepartments()
        {
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load("../App.config");
                // 创建一个工厂对象
                SysFactory factory = new SysFactory();
                // 读取配置文件中的观察者类型列表
                string[] observerTypes = ConfigurationManager.AppSettings["ObserverTypes"].Split(',');
                // 遍历观察者类型列表
                foreach (string observerType in observerTypes)
                {
                    // 根据观察者类型，创建相应的观察者对象
                    SysCla sya = factory.CreateSys(observerType);
                    sya.Update(this);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }


    public abstract class SysCla
    {
        // 收到项目创建时的反应
        public abstract void Update(Project project);
    }

    public class SysPL : SysCla
    { 
        // 收到项目创建时的反应，子系统根据项目名称进行开发工作
        public override void Update(Project project)
        {
            Console.WriteLine($"子系统A开始处理项目：项目编号：{project.ProjCode}，项目名称：{project.ProjName}");

        }
    }
    public class SysPM : SysCla
    { 
        // 收到项目创建时的反应，子系统B
        public override void Update(Project project)
        {
            Console.WriteLine($"子系统B开始处理项目：项目编号：{project.ProjCode}，项目名称：{project.ProjName}");
        }
    }
    // 定义抽象工厂类或接口
    public interface ISysFactory {
        // 创建观察者对象的方法，接受一个字符串参数，表示观察者类型
        SysCla CreateSys(string type); 
    }

    // 实现抽象工厂类或接口的具体工厂类
    public class SysFactory : ISysFactory
    { 
        // 创建观察者对象的方法，根据字符串参数，返回相应类型的观察者对象
      public SysCla CreateSys(string type) 
        { 
            switch (type) 
            { 
                case "PL": 
                    return new SysPL(); 
                case "PM": 
                    return new SysPM(); 
                default: throw new ArgumentException("该子系统不存在");
            }
        } 
    }
}
